import fitz  # PyMuPDF——轻量级、跨平台的 PDF 渲染/处理库
from PIL import Image  # Pillow 图像处理库
def pdf_to_longimage(pdf_path, output_path="output.png", dpi=300):
    """
    将多页 PDF 合并为一张纵向长图
    参数
    ----
    pdf_path : str
        输入 PDF 文件路径
    output_path : str, optional
        输出长图保存路径，默认 output.png
    dpi : int, optional
        渲染分辨率，值越大越清晰，文件也越大，默认 300

    返回
    ----
    str
        最终生成的长图路径
    """

    # 1. 打开 PDF
    doc = fitz.open(pdf_path)
    # 2. 逐页渲染为 Pillow 图像对象
    images = []
    for page in doc:
        # 2-1. 使用 PyMuPDF 将当前页渲染成高分辨率位图
        # get_pixmap() 返回 fitz.Pixmap，包含位图数据
        pix = page.get_pixmap(dpi=dpi)
        # 2-2. Pixmap → Pillow.Image
        # Image.frombytes(mode, size, data) 直接依据字节流创建 Pillow 图像
        images.append(
            Image.frombytes("RGB",  # 颜色模式
                            [pix.width, pix.height],  # 宽高
                            pix.samples)  # 原始像素字节流
        )
    # 3. 计算长图最终尺寸
    # 3-1. 宽度：取所有页面中最窄的宽度，保证整图宽度一致
    min_width = min(img.width for img in images)
    # 3-2. 高度：所有页面高度之和
    total_height = sum(img.height for img in images)
    # 4. 创建空白长图画布
    long_img = Image.new("RGB", (min_width, total_height))
    # 5. 逐页粘贴到长图
    y_offset = 0  # 当前粘贴位置的纵向偏移量
    for img in images:
        # 5-1. 把当前页缩放到 min_width 宽度，高度等比缩放
        resized = img.resize((min_width, img.height))
        # 5-2. 粘贴到指定纵向坐标
        long_img.paste(resized, (0, y_offset))
        # 5-3. 更新偏移量，准备下一页
        y_offset += img.height
    # 6. 保存最终长图
    long_img.save(output_path)
    # 7. 返回保存路径
    return output_path

#调用
pdf_to_longimage("驾驶证.pdf", dpi=400)
